<?php

namespace app\api\Service;

use app\common\library\Auth;
use app\common\model\Area;
use think\Config;
use think\Db;
use think\Validate;

class AddressService
{

    /**
     * 获取用户地址列表
     *
     * 该方法用于查询并返回当前用户的所有地址信息，包括地址的详细内容和所在地区的名称
     * 它首先确定当前用户，然后查询该用户的地址列表，并进一步查询每个地址的省份、城市和区域名称
     */
    public static function getList()
    {
        // 实例化Auth类以获取当前用户信息
        $auth = Auth::instance();

        // 获取当前用户ID
        $user_id = $auth->id;

        // 查询用户购物车中的商品信息，包括商品ID、名称、图片、数量和价格
        $list = \app\admin\model\UserAddress::where(['user_id' => $user_id,'deletetime'=>null])->order('is_default desc,createtime desc')->field('id,name,mobile,province_id,city_id,area_id,address,is_default')->select();
        if($list){
            foreach($list as &$row){
                // 根据地区ID查询并获取省份简称
                $row['province'] = \app\admin\model\Area::where(['id' => $row['province_id']])->value('shortname');
                // 根据地区ID查询并获取城市简称
                $row['city'] = \app\admin\model\Area::where(['id' => $row['city_id']])->value('shortname');
                // 根据地区ID查询并获取区域简称
                $row['area'] = \app\admin\model\Area::where(['id' => $row['area_id']])->value('shortname');
            }
        }
        // 返回查询结果，包括商品总数和商品列表
        return ['code' =>1,'msg'=>'查询成功','data'=>['total' =>count($list),'rows'=>$list]];
    }

    /**
     * 添加用户地址信息
     *
     * @param array $data 包含地址信息的数组
     * @return array 包含操作结果的数组
     */
    public static function add($data)
    {
        // 实例化认证类以获取当前用户信息
        $auth = Auth::instance();
        // 获取当前用户的ID
        $user_id = $auth->id;
        // 从传入的数据中提取地址信息
        $name = $data['name'];
        $mobile = $data['mobile'];
        $province_id = $data['province_id'];
        $city_id = $data['city_id'];
        $area_id = $data['area_id'];
        // 地址字段为可选，因此使用isset判断是否存在，不存在则赋予空字符串
        $address = isset($data['address']) ? $data['address'] : '';
        // 是否默认地址字段为可选，不存在则赋予0
        $is_default = isset($data['is_default']) ? $data['is_default'] : 0;

        // 验证姓名不为空
        if(!$name) return ['code'=>0,'msg'=>'姓名不为空','data'=>''];
        // 验证手机号格式正确
        if (!Validate::regex($mobile, "^1\d{10}$")) return ['code'=>0,'msg'=>'手机号格式不正确','data'=>''];
        // 验证省份不为空
        if(!$province_id) return ['code'=>0,'msg'=>'请选择省份','data'=>''];
        // 验证城市不为空
        if(!$city_id) return ['code'=>0,'msg'=>'请选择城市','data'=>''];
        // 验证区域不为空
        if(!$area_id) return ['code'=>0,'msg'=>'请选择区域','data'=>''];

        // 开始数据库事务
        try{
            // 准备插入数据库的数据
            $param = [
                'user_id'      =>  $user_id,
                'name'      =>  $name,
                'mobile'      =>  $mobile,
                'province_id'      =>  $province_id,
                'city_id'      =>  $city_id,
                'area_id'      =>  $area_id,
                'address'      =>  $address,
                'is_default'      =>  $is_default,
            ];

            // 如果新地址被设置为默认地址，则将该用户的所有其他地址的默认标志重置为0
            if($is_default) {
                $map = [
                    'user_id'      =>  $user_id,
                    'is_default'      =>  1,
                ];
                \app\admin\model\UserAddress::where($map)->update(['is_default'=>0]);
            }

            // 创建新的用户地址记录
            $res = \app\admin\model\UserAddress::create($param);
            // 提交事务
            Db::commit();
            // 根据操作结果返回相应的消息
            if($res){
                return ['code'=>1,'msg'=>'操作成功','data'=>''];
            }else{
                return ['code'=>0,'msg'=>'操作失败','data'=>''];
            }
        }catch(\Exception $e){
            // 如果发生异常，则回滚事务
            Db::rollback();
            // 返回异常信息
            return ['code'=>0,'message'=>$e->getMessage(),'data'=>''];
        }
    }

    /**
     * 编辑用户地址信息
     *
     * @param array $data 包含地址信息的数组
     * @return array 包含操作结果的数组
     */
    public static function edit($data)
    {
        // 实例化认证类
        $auth = Auth::instance();
        // 获取当前用户的ID
        $user_id = $auth->id;
        // 从输入数据中获取购物车ID
        $address_id = $data['address_id'];
        // 从传入的数据中提取地址信息
        $name = $data['name'];
        $mobile = $data['mobile'];
        $province_id = $data['province_id'];
        $city_id = $data['city_id'];
        $area_id = $data['area_id'];
        // 地址字段为可选，因此使用isset判断是否存在，不存在则赋予空字符串
        $address = isset($data['address']) ? $data['address'] : '';
        // 是否默认地址字段为可选，不存在则赋予0
        $is_default = isset($data['is_default']) ? $data['is_default'] : 0;

        // 验证姓名不为空
        if(!$name) return ['code'=>0,'msg'=>'姓名不为空','data'=>''];
        // 验证手机号格式正确
        if (!Validate::regex($mobile, "^1\d{10}$")) return ['code'=>0,'msg'=>'手机号格式不正确','data'=>''];
        // 验证省份不为空
        if(!$province_id) return ['code'=>0,'msg'=>'请选择省份','data'=>''];
        // 验证城市不为空
        if(!$city_id) return ['code'=>0,'msg'=>'请选择城市','data'=>''];
        // 验证区域不为空
        if(!$area_id) return ['code'=>0,'msg'=>'请选择区域','data'=>''];

        // 查询购物车信息，确保购物车属于当前用户
        $addressInfo = \app\admin\model\UserAddress::where(['id' => $address_id,'user_id' => $user_id])->find();
        // 如果购物车信息不存在，返回参数错误
        if (!$addressInfo) return ['code' =>0,'msg'=>'参数错误','data'=>''];

        // 开始数据库事务
        Db::startTrans();
        try{
            // 如果新地址被设置为默认地址，则将该用户的所有其他地址的默认标志重置为0
            if($is_default) {
                $map = [
                    'user_id'      =>  $user_id,
                    'is_default'      =>  1,
                ];
                \app\admin\model\UserAddress::where($map)->update(['is_default'=>0]);
            }

            // 更新地址信息
            $addressInfo->name = $name;
            $addressInfo->mobile = $mobile;
            $addressInfo->province_id = $province_id;
            $addressInfo->city_id = $city_id;
            $addressInfo->area_id = $area_id;
            $addressInfo->address = $address;
            $addressInfo->is_default = $is_default;
            // 保存地址信息
            $res = $addressInfo->save();

            // 提交事务
            Db::commit();
            // 根据操作结果返回相应的消息
            if($res){
                return ['code'=>1,'msg'=>'操作成功','data'=>''];
            }else{
                return ['code'=>0,'msg'=>'操作失败','data'=>''];
            }
        }catch(\Exception $e){
            // 如果发生异常，回滚事务
            Db::rollback();
            // 返回异常信息
            return ['code'=>0,'message'=>$e->getMessage(),'data'=>''];
        }
    }



    public static function delete($data)
    {
        // 实例化身份验证类以获取当前用户信息
        $auth = Auth::instance();
        // 获取当前用户ID
        $user_id = $auth->id;
        // 提取要删除的购物车项ID数组
        $address_id = $data['address_id'];

        // 检查购物车项ID数组是否为空，如果为空则返回错误信息
        if(empty($address_id)) return ['code' =>0,'msg'=>'请选择要删除的项','data'=>''];

        // 开始事务处理，以确保数据库操作的完整性
        Db::startTrans();
        try{
            // 执行删除操作，只删除属于当前用户的指定购物车项
            $res = \app\admin\model\UserAddress::where(['id' => $address_id,'user_id'=>$user_id])->update(['deletetime'=>time()]);

            // 提交事务，如果删除成功
            Db::commit();
            if($res){
                // 返回成功信息
                return ['code'=>1,'msg'=>'操作成功','data'=>''];
            }else{
                // 如果删除失败，返回失败信息
                return ['code'=>0,'msg'=>'操作失败','data'=>''];
            }
        }catch(\Exception $e){
            // 如果发生异常，回滚事务
            Db::rollback();
            // 返回异常信息
            return ['code'=>0,'message'=>$e->getMessage(),'data'=>''];
        }
    }
}